package gg.com.toolbox.sqlite;

import android.content.Context;
import android.database.Cursor;
import android.database.DatabaseErrorHandler;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

/**
 * 数据库类
 * Created by gaoge on 2017/10/12.
 */

public class DatabaseHelper extends SQLiteOpenHelper {

    // 数据库版本号
    private static final int DATABASE_VERSION = 1;
    // 数据库名
    private static final String DATABASE_NAME = "gg.db";
    //账号密码保存表
    public static final String PASSWORD_TABLE = "username";

    // 构造函数，调用父类SQLiteOpenHelper的构造函数
    public DatabaseHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
        // 数据库实际被创建是在getWritableDatabase()或getReadableDatabase()方法调用时
        // CursorFactory设置为null,使用系统默认的工厂类
    }

    // 构造函数，调用父类SQLiteOpenHelper的构造函数
    public DatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
        // SQLiteOpenHelper的构造函数参数：
        // context：上下文环境
        // name：数据库名字
        // factory：游标工厂（可选）
        // version：数据库模型版本号
    }

    // 构造函数，调用父类SQLiteOpenHelper的构造函数
    public DatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version, DatabaseErrorHandler errorHandler) {
        super(context, name, factory, version, errorHandler);
    }

    // 继承SQLiteOpenHelper类,必须要覆写的三个方法：onCreate(),onUpgrade(),onOpen()
    @Override
    public void onCreate(SQLiteDatabase db) {
        // 调用时间：数据库第一次创建时onCreate()方法会被调用
        // onCreate方法有一个 SQLiteDatabase对象作为参数，根据需要对这个对象填充表和初始化数据
        // 这个方法中主要完成创建数据库后对数据库的操作
        // 构建创建表的SQL语句（可以从SQLite Expert工具的DDL粘贴过来加进StringBuffer中）
        // 即便程序修改重新运行，只要数据库已经创建过，就不会再进入这个onCreate方法
        String sql = null;
        /**创建账号表*/
        sql = sqlString(PASSWORD_TABLE);
        // 执行创建表的SQL语句
        db.execSQL(sql);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // 调用时间：如果DATABASE_VERSION值被改为别的数,系统发现现有数据库版本不同,即会调用onUpgrade
        // onUpgrade方法的三个参数，一个 SQLiteDatabase对象，一个旧的版本号和一个新的版本号
        // 这样就可以把一个数据库从旧的模型转变到新的模型
        // 这个方法中主要完成更改数据库版本的操作
        // 上述做法简单来说就是，通过检查常量值来决定如何，升级时删除旧表，然后调用onCreate来创建新表
        // 一般在实际项目中是不能这么做的，正确的做法是在更新数据表结构时，还要考虑用户存放于数据库中的数据不丢失

//        String sql = null;
//        /**查询用户表是否存在*/
//        if (selectNull(db, PASSWORD_TABLE) != 0) {
//            //查询是否存在会员列
//            if (!checkColumnExist(db, PASSWORD_TABLE, "isVIP")) {
//                /**
//                 * 如果表中没有会员字段，则向用户信息表中添加会员字段
//                 */
//                db.execSQL("alter table " + PASSWORD_TABLE + " add isVIP INTEGER");
//            }
//        } else {
//            //如果不存在，则创建
//            sql = sqlString(PASSWORD_TABLE);
//            // 执行创建表的SQL语句
//            db.execSQL(sql);
//        }
    }

    /**
     * 查询表是否为空
     *
     * @param data      数据库对象
     * @param tableName 表名
     */

    public int selectNull(SQLiteDatabase data, String tableName) {
        int number;
        Cursor c = data.rawQuery("SELECT count(*) FROM sqlite_master WHERE type='table' AND name='" + tableName + "'", null);
        number = c.getCount();
        return number;
    }

    /**
     * 方法1：检查某表列是否存在
     *
     * @param db
     * @param tableName  表名
     * @param columnName 列名
     * @return
     */
    private boolean checkColumnExist(SQLiteDatabase db, String tableName
            , String columnName) {
        boolean result = false;
        Cursor cursor = null;
        try {
            //查询一行
            cursor = db.rawQuery("SELECT * FROM " + tableName + " LIMIT 0"
                    , null);
            result = cursor != null && cursor.getColumnIndex(columnName) != -1;
        } catch (Exception e) {
        } finally {
            if (null != cursor && !cursor.isClosed()) {
                cursor.close();
            }
        }

        return result;
    }

    /**
     * 筛选sql语句
     *
     * @param tableName 表名
     * @return sql语句
     */
    public String sqlString(String tableName) {
        String sql = null;
        switch (tableName) {
            //创建用户表
            case PASSWORD_TABLE:
                /**
                 * _id 主键  title 平台   username 账号   password 密码  remarks 备注
                 */
                sql = "create table " + PASSWORD_TABLE
                        + "(_id integer primary key autoincrement,title text,username text,password text,remarks text);";
                break;
        }
        return sql;
    }
}
